/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logistica.beans;

import entities.FacturaPedidoFabrica;
import entities.LineaFacturaPedidoFabrica;
import entities.LineaPedidoFabrica;
import entities.PedidoFabrica;
import entities.Producto;
import entities.ProductoTalla;
import facades.FacturaPedidoFabricaFacade;
import facades.LineaFacturaPedidoFabricaFacade;
import facades.PedidoFabricaFacade;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import qualifiers.EventoEntidadCreada;
import qualifiers.EventoEntidadEditada;
import qualifiers.EventoEntidadElegida;
import qualifiers.EventoPreEditarEntidad;

/**
 *
 * @author damfercer
 */
@Named(value = "editarFacturaPedidoFabricaBean")
@SessionScoped
public class EditarFacturaPedidoFabricaBean implements Serializable{
    @Inject
    private FacturaPedidoFabricaFacade facturaPedidoFabricaFacade;
    @Inject
    private PedidoFabricaFacade pedidoFabricaFacade;
    @Inject
    private LineaFacturaPedidoFabricaFacade lineaFacturaPedidoFabricaFacade;
    private FacturaPedidoFabrica facturaPedidoFabrica;
    private List<Integer> idsAEditar;
    private Map<Integer, BigDecimal> precios;
    private List<LineaFacturaPedidoFabrica> lineasPrecios;
    private List<Producto> productosPrecios;
    @Inject
    @EventoPreEditarEntidad
    Event<LineaFacturaPedidoFabrica> eventoLineaFacturaPedidoFabricaPreEditada;
    @Inject
    @EventoEntidadEditada
    Event<LineaFacturaPedidoFabrica> eventoLineaFacturaPedidoFabricaEditada;
    @Inject
    @EventoEntidadEditada
    Event<FacturaPedidoFabrica> eventoFacturaPedidoFabricaEditada;
    @Inject
    @EventoEntidadEditada
    Event<PedidoFabrica> eventoPedidoFabricaEditado;
    /**
     * Creates a new instance of EditarFacturaPedidoFabricaBean
     */
    public EditarFacturaPedidoFabricaBean() {
    }
    
    public void onFacturaPedidoFabricaElegida(@Observes @EventoEntidadElegida FacturaPedidoFabrica factura){
        this.facturaPedidoFabrica=factura;
        this.idsAEditar=new ArrayList<Integer>();
        this.precios=new HashMap<Integer, BigDecimal>();
        this.lineasPrecios=new ArrayList<LineaFacturaPedidoFabrica>();
        this.productosPrecios=new ArrayList<Producto>();
        getProductosDiferentes();
    }
    
    public void onNuevaFacturaPedidoFabrica(@Observes @EventoEntidadCreada FacturaPedidoFabrica factura){
        this.facturaPedidoFabrica=factura;
        this.idsAEditar=new ArrayList<Integer>();
        this.precios=new HashMap<Integer, BigDecimal>();
        this.lineasPrecios=new ArrayList<LineaFacturaPedidoFabrica>();
        this.productosPrecios=new ArrayList<Producto>();
        getProductosDiferentes();
    }

    /**
     * @return the facturaPedidoFabrica
     */
    public FacturaPedidoFabrica getFacturaPedidoFabrica() {
        return facturaPedidoFabrica;
    }

    /**
     * @param facturaPedidoFabrica the facturaPedidoFabrica to set
     */
    public void setFacturaPedidoFabrica(FacturaPedidoFabrica facturaPedidoFabrica) {
        this.facturaPedidoFabrica = facturaPedidoFabrica;
    }
    
    private void refrescarPedidoFabrica(){
        eventoFacturaPedidoFabricaEditada.fire(facturaPedidoFabrica);
        eventoPedidoFabricaEditado.fire(facturaPedidoFabrica.getPedidoFabrica());
        pedidoFabricaFacade.evict(facturaPedidoFabrica.getPedidoFabrica(), facturaPedidoFabrica.getPedidoFabrica().getIdPedidoFabrica());
        facturaPedidoFabricaFacade.evict(facturaPedidoFabrica, facturaPedidoFabrica.getIdFacturaPedidoFabrica());
    }
    
    public void editarFacturaPedidoFabrica(){
        facturaPedidoFabricaFacade.edit(facturaPedidoFabrica);
        refrescarPedidoFabrica();
    }
    
    public void editarLineasFactura(){
        for (LineaFacturaPedidoFabrica lineaFactura : facturaPedidoFabrica.getLineaFacturaPedidoFabricaList()) {
            if(idsAEditar.contains(lineaFactura.getIdLineaFacturaPedidoFabrica())){
                //eventoLineaFacturaPedidoFabricaPreEditada.fire(lineaFactura);
                lineaFacturaPedidoFabricaFacade.edit(lineaFactura);
                eventoLineaFacturaPedidoFabricaEditada.fire(lineaFactura);
            }
        }
        refrescarPedidoFabrica();
    }
    
    public void editarLineasFacturaPrecio(){
        for (LineaFacturaPedidoFabrica lineaFactura : facturaPedidoFabrica.getLineaFacturaPedidoFabricaList()) {
            if(idsAEditar.contains(lineaFactura.getIdLineaFacturaPedidoFabrica())){
                eventoLineaFacturaPedidoFabricaPreEditada.fire(lineaFactura);
                lineaFacturaPedidoFabricaFacade.edit(lineaFactura);
                eventoLineaFacturaPedidoFabricaEditada.fire(lineaFactura);
            }
        }
        refrescarPedidoFabrica();
    }
      
    public void addId(LineaFacturaPedidoFabrica lf){
        if(!this.idsAEditar.contains(lf.getIdLineaFacturaPedidoFabrica())){
            this.idsAEditar.add(lf.getIdLineaFacturaPedidoFabrica());
        }
    }
    
    public void replicarPrecios(LineaFacturaPedidoFabrica linea){
        for(LineaFacturaPedidoFabrica lf: this.facturaPedidoFabrica.getLineaFacturaPedidoFabricaList()){
            if(lf.getProductoTalla().getProducto().equals(linea.getProductoTalla().getProducto())){
                lf.setPrecioUnitario(linea.getPrecioUnitario());
                this.idsAEditar.add(lf.getIdLineaFacturaPedidoFabrica());
            }
        }
    }
    
    public void replicarOk(LineaFacturaPedidoFabrica linea){
        for(LineaFacturaPedidoFabrica lf: this.facturaPedidoFabrica.getLineaFacturaPedidoFabricaList()){
            if(lf.getProductoTalla().getProducto().equals(linea.getProductoTalla().getProducto())){
                lf.setOk(linea.getOk());
                this.idsAEditar.add(lf.getIdLineaFacturaPedidoFabrica());
            }
        }
    }
    
    public void replicarComentarios(LineaFacturaPedidoFabrica linea){
        if(linea.getComentarios()!=null){
            for(LineaFacturaPedidoFabrica lf: this.facturaPedidoFabrica.getLineaFacturaPedidoFabricaList()){
                if(lf.getProductoTalla().getProducto().equals(linea.getProductoTalla().getProducto())){
                    lf.setComentarios(linea.getComentarios());
                    this.idsAEditar.add(lf.getIdLineaFacturaPedidoFabrica());
                }
            }
        }
        
    }
    
    public void getProductosDiferentes(){
        for(LineaFacturaPedidoFabrica l: facturaPedidoFabrica.getLineaFacturaPedidoFabricaList()){
            if(!productosPrecios.contains(l.getProductoTalla().getProducto())){
                getLineasPrecios().add(l);
                this.productosPrecios.add(l.getProductoTalla().getProducto());
            }
        }
    }
    
    public Integer recuperarCantidadFacturadaDeProducto(Producto p){
        Integer cantidad=0;
        for(LineaFacturaPedidoFabrica l: facturaPedidoFabrica.getLineaFacturaPedidoFabricaList()){
            if(l.getProductoTalla().getProducto().equals(p)){
                cantidad+=l.getCantidad();
            }
        }
        return cantidad;
    }
    
    public Integer recuperarCantidadPedidaDeProductoTalla(ProductoTalla pt){
        Integer cantidad=0;
        for(LineaPedidoFabrica lpf : this.facturaPedidoFabrica.getPedidoFabrica().getLineaPedidoFabricaList()){
            if(lpf.getProductoTalla().equals(pt)){
                cantidad=lpf.getCantidad();
            }
        }
        return cantidad;
    }
    
    public void editarPrecio(Producto p){
        
    }

    /**
     * @return the lineasPrecios
     */
    public List<LineaFacturaPedidoFabrica> getLineasPrecios() {
        return lineasPrecios;
    }

    /**
     * @param lineasPrecios the lineasPrecios to set
     */
    public void setLineasPrecios(List<LineaFacturaPedidoFabrica> lineasPrecios) {
        this.lineasPrecios = lineasPrecios;
    }
}
